package com.example.demoamqp.config;

import com.example.demoamqp.conatants.Constants;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 且听风吟
 * @version 1.0
 * @description: TTL队列 具有过期时间的队列配置 配置文件代码
 * 声名 一个普通交换机、两个普通队列、一个死信交换机、一个死信队列
 * @date 2022/4/24 0024 13:50
 */
@Configuration
public class TtlQueueConfig {

    /**
     * 声名 普通交换机（EXCHANGE_X）
     *
     * @return 普通交换机
     */
    @Bean
    public DirectExchange EXCHANGEX() {
        return new DirectExchange(Constants.EXCHANGE_X);
    }

    /**
     * 声名 死信交换机（EXCHANGE_DEAD_Y）
     *
     * @return 死信交换机
     */
    @Bean
    public DirectExchange EXCHANGEDEADY() {
        return new DirectExchange(Constants.EXCHANGE_DEAD_Y);
    }

    /**
     * 声名普通队列 QUEUE_A TTL为10s
     *
     * @return 普通队列 QUEUE_A
     */
    @Bean
    public Queue QUEUE_A() {
        //声名参数
        Map<String, Object> arguments = new HashMap<>(3);
        //设置死信交换机
        arguments.put("x-dead-letter-exchange", Constants.EXCHANGE_DEAD_Y);
        //设置死信RoutingKey
        arguments.put("x-dead-letter-routing-key", "YD");
        //设置 TTL 10s
        arguments.put("x-message-ttl", 10000);

        return QueueBuilder.durable(Constants.QUEUE_A).withArguments(arguments).build();
    }

    /**
     * 声名普通队列 QUEUE_B TTL为40s
     *
     * @return 普通队列 QUEUE_B
     */
    @Bean
    public Queue QUEUE_B() {
        //声名参数
        Map<String, Object> arguments = new HashMap<>(3);
        //设置死信交换机
        arguments.put("x-dead-letter-exchange", Constants.EXCHANGE_DEAD_Y);
        //设置死信RoutingKey
        arguments.put("x-dead-letter-routing-key", "YD");
        //设置 TTL 40s
        arguments.put("x-message-ttl", 400000);

        return QueueBuilder.durable(Constants.QUEUE_B).withArguments(arguments).build();
    }

    /**
     * 声名死信队列 QUEUE_DEAD_D
     *
     * @return 死信队列 QUEUE_DEAD_D
     */
    @Bean
    public Queue QUEUE_DEAD_D() {
        return QueueBuilder.durable(Constants.QUEUE_DEAD_D).build();
    }

    /**
     * 普通队列QA 通过 routingKey XA 绑定 普通交换机X
     *
     * @param QUEUE_A   普通队列QA
     * @param EXCHANGEX 普通交换机X
     * @return 绑定
     */
    @Bean
    public Binding queueABindingX(Queue QUEUE_A, DirectExchange EXCHANGEX) {
        return BindingBuilder.bind(QUEUE_A).to(EXCHANGEX).with("XA");
    }

    /**
     * 普通队列QB 通过 routingKey XB 绑定 普通交换机X
     *
     * @param QUEUE_B   普通队列QB
     * @param EXCHANGEX 普通交换机X
     * @return 绑定
     */
    @Bean
    public Binding queueBBindingX(Queue QUEUE_B, DirectExchange EXCHANGEX) {
        return BindingBuilder.bind(QUEUE_B).to(EXCHANGEX).with("XB");
    }

    /**
     * 死信队列QD 通过 routingKey YD 绑定 死信交换机Y
     *
     * @param QUEUE_DEAD_D  死信队列QD
     * @param EXCHANGEDEADY 死信交换机Y
     * @return 绑定
     */
    @Bean
    public Binding queueDBindingX(Queue QUEUE_DEAD_D, DirectExchange EXCHANGEDEADY) {
        return BindingBuilder.bind(QUEUE_DEAD_D).to(EXCHANGEDEADY).with("YD");
    }

}
